<?php
/**
 * @author
 * @copyright
 * @version 1.0
 * @since Feb-2009
 * @package lib
 * @subpackage utils
 * @name CTransaction
 * @deprecated thao tác với file zip
 *
 */
// Khoanb Edit 11.07.09
require_once ROOT_DIR.'3rdparty/vogoo/VogooProduct.php';
class CTransaction
{
	const NORMAl_TRANSPORT_METHOD=1;
	const IMMEDIATE_TRANSPORT_METHOD=2;
	var $totalProduct;
	var $userId;
	var $cacheZoneLocation;
	var $cacheLocation;
	var $cacheTransportFee;
	var $cache_time;
	var $incrementTax = false;
	function __construct($userId=false)
	{
		$this->cacheZoneLocation = 'zone_location_'.CPortal::$estore_id;
		$this->cacheLocation = 'location_'.CPortal::$estore_id;
		$this->cacheTransportFee = 'transport_fee_'.CPortal::$estore_id;
		$this->cache_time = 86400;
		if ($userId)
			$this->userId = $userId;
	}

	function getCacheTransaction($type = '', $cache_time = 86400) {
		switch($type) {
			case 'location':
				$cache_name = $this->cacheLocation;
				$table = 'location';
				break;
			case 'transport_fee':
				$cache_name = $this->cacheTransportFee;
				$table = 'transport_fee';
				break;
			case '':
			default:
				$cache_name = $this->cacheZoneLocation;
				$table = 'zone_location';
				break;
		}
		if (!($value = CSystem::$cachedata->get($cache_name))) {
			$value = CTable($table)->select_all();
			CSystem::$cachedata->set($cache_name, $value, $cache_time);
		}
		return $value;
	}

	/** Lấy tên của phương thức thanh toán để hiển thị
	 * @return string
	 */
	function getPaymentName($value) {
		$name = "Trả sau";
		switch($value) {
			case 1 : //Thanh toán trả sau
				$name = "Trả sau";
				break;
			case 2 : //Thanh toán trả trước
				$name = "Trả trước";
				break;
		}
		return $name;
	}

	function transportMethodName($method) {
		$name="Giao hàng thường";
		switch($method) {
			case 1 : //Thanh toán trả sau
				$name = "Giao hàng thường";
				break;
			case 2 : //Thanh toán trả trước
				$name = "Giao hàng ngay";
				break;
		}
		return $name;
	}

	function getPaymentFee($amount) {
		return (0.5 * $amount)/100;
	}	// End Func

	/**
	 * Enter description here...
	 *
	 * @param các sản phẩm trong giỏ hàng $shopping_cart
	 * @return Mảng chứa các thông tin về trọng lượng sản phẩm trong giỏ hàng, tiền hàng(đã tính thuế), sản phẩm được khuyến mại,...
	 */
	function getCartProducts($shopping_cart) {
 		$product_amount=0;
 		$total_weight=0;
 		$products = array();
 		$i=0;
 		$max_price=0;
 		$max_index=0;
 		if (is_array($shopping_cart)) {
	 		foreach ($shopping_cart as $key=>$item) {
	 			$i++;
	 			$product_id=!empty($item['product_id'])?$item['product_id']:((isset($item['id']))?$item['id']:'');
	 			$product=CTable('product')->select($product_id);
	 			$product_obj = new CProductDetail($product);
	 			$seller_id = (isset($item['seller_id']))?$item['seller_id']:'';

	 			/*
	 			if ($seller_id=='' && $product_obj->isPromoting()) {
	 			} else {
	 				$item['price'] = $product_obj->getRealPrice();
	 			}*/

	 			$amount = ceil($item['quantity']*($item['price']));
	 			$pack_weight=!empty($item['pack_weight'])?$item['pack_weight']:(!empty($item['weight'])?$item['weight']:0);
				$weight=($pack_weight*$item['quantity']);

				$aAmount = array('amount' => $amount);
				if($this->incrementTax) {
					$aAmount = array('amount' => $amount + $item['tax']*$item['quantity']);
				}
	 			$products[$i] = array(
					'product_id'=>$product_id,
					'product_code'=>!empty($item['product_code'])?$item['product_code']:((isset($item['code']))?$item['code']:''),
					'product_name'=>!empty($item['product_name'])?$item['product_name']:((isset($item['name']))?$item['name']:''),
					'portal_id'=>$item['portal_id'],
					'portal_path'=>$item['portal_path'],
					'price'=>$item['price'],
					'min_price'=>$item['min_price'],
					'quantity'=>$item['quantity'],
					'weight'=>$pack_weight,
					'tax' => $item['tax'],
					'discount_value'=>$item['price'],
					'discount_percent'=>$item['discount_percent'],
					//'amount'=>$amount + $item['tax']*$item['quantity'],
					'is_deleted'=>0,'transaction_id'=>0,'status'=>0,
					'seller_id'=>$seller_id
				)+$aAmount;

				// Xác định sản phẩm có giá cao nhất để hưởng khuyến mại
				// if ($item['price']>$max_price && $item['discount_percent']>0) {
				//   $max_price=$item['price'];
				//   $max_index=$i;
				// }
				$amount = $products[$i]['amount'];
				$total_weight+=$weight;
				$product_amount += $amount;
	 		}
 		}
 		/*Kiểm tra khách hàng đã được khuyến mại chưa
 		$condition =CTable('daily_promotion')->select(EAnd(EGT('date',time()-24*3600),ELTE('date',time()),ELike('winners',EString(','.$this->userId.','))));
 		$condition=empty($condition)?true:false;
		$discount_value = $discount_percent = 0;
		$discount_name = '';
 		if(($max_index>0) && ($condition==true))
 		{
 			$products[$max_index]['discount_value'] = $products[$max_index]['discount_percent']*($products[$max_index]['price']+$products[$max_index]['tax'])/100;
 			$product_amount-=$products[$max_index]['discount_value'];
 			$discount_value = $products[$max_index]['discount_value'];
 			$discount_percent = $products[$max_index]['discount_percent'];
 			$discount_name = $products[$max_index]['product_name'];
 		}*/
		return array(
			'weight'						=> $total_weight,
			'products'					=> $products,
			'product_amount'		=> $product_amount,
			'discount_value'		=> 0,//$discount_value,
			'discount_percent'	=> 0,// $discount_percent,
			'discount_name'			=> ''// $discount_name,
			//'condition'				=> $condition
		);
	}  // End Func

	/** Lấy vùng
	 * param: $area_id( int )
	 * @return string
	 */

	function getStores($zone_id) {
		if (!($locationZone = CSystem::$cachedata->get($this->cacheZoneLocation))) {
			$locationZone = CTable('zone_location')->select_all();
			CSystem::$cachedata->set($this->cacheZoneLocation, $locationZone, $this->cache_time);
		}
		$area_id = CRecord($this->getLocationZone($locationZone, $zone_id))->area_id;
		$stores = CTable('store')->select_all(EEqual('area_id',$area_id));
		return $stores;
	}

	/** Lấy vị trí của người mua
	 * param: $zone_id( int )
	 * @return string
	 */

	function getLocationZone($locationZone, $zone_id) {
	 	$postionZone = 1;
	 	foreach($locationZone as $k => $v) {
			if($v['zone_id'] == $zone_id) {
				$postionZone = $k;
			}
		}
		return $locationZone[$postionZone];
	 }

	function getLocation($zone_id) {
		$locationId = $this->getLocationZone($this->getCacheTransaction(), $zone_id);
		$valueLocation = array();
		$location = $this->getCacheTransaction('location');
		foreach($location as $key => $value) {
			if($value['id'] == $locationId['location_id']) {
				$valueLocation = $location[$key];
			}
		}
		return $valueLocation;
	}
	/**
	 * Tính thời gian chờ chuyển hàng
	 *
	 * @param unknown_type $location_id
	 * @param unknown_type $products
	 * @param unknown_type $stores
	 * @return unknown
	 */
	function getWaitingTime1($location_id,$products,$stores)
	{
		if($location_id>1) {
			$waiting_time=24;
		}else{
			$waiting_time = $this->checkingStore($products,$stores)?3:24;
		}
		return $waiting_time;
	}
	function getWaitingTime($district_id=0)
	{
		if (empty($district_id))
			return 24;
		//CTable('district_shipping_fee')->fields('name,id,vas_fee,addition_fee,province_id,type')->select_all();
		$record = CTable('district_shipping_fee')->fields('addition_fee,vas_fee,waiting_time')->select($district_id);
		$waiting_time=$record['waiting_time'];
		return $waiting_time;
	}

	function additionShippingFee($district_id=0,$transport_method)
	{
		if (empty($district_id))
			return 0;
		$record=CTable('district_shipping_fee')->fields('addition_fee,vas_fee,waiting_time')->select($district_id);
		$addition_fee=0;
		if (is_array($record))
		{
			$addition_fee=$record['addition_fee'];
			switch($transport_method) {
				case CTransaction::IMMEDIATE_TRANSPORT_METHOD : //Thanh toán trả sau
					$addition_fee+=$record['vas_fee'];
					break;
				case CTransaction::NORMAl_TRANSPORT_METHOD: //Thanh toán trả sau
					break;

			}
		}
		return $addition_fee;
	}
	//Tính phí vận chuyển
	function getShippingFee($weight,$zone_id,$location=false,$district_id=0,$transport_method=CTransaction::NORMAl_TRANSPORT_METHOD)
	{
		if ($weight==0)
			$weight=1;
		if (empty($location))
			$location = $this->getLocation($zone_id);
		if(!($transport_fee = CTable('transport_fee')->select(EAnd(
			ELT('min_weight',EInt($weight) ),
			EEqual('location_id',EInt($location['id'])),
			EEqual('transporter_id',EString('hopnhat'))
		),array('order_by'=>'min_weight desc'))))
		{
			if(!($transport_fee = CTable('transport_fee')->select(
				array(
					'location_id' => EInt($location['id']),
					'transporter_id' => 'hopnhat'
				),
				array(
					'order_by' => 'min_weight desc'
				)
			)))
			{
				$transport_fee = CTable('transport_fee')->select(
					array('transporter_id' => 'hopnhat'),
					array(
						'order_by' => 'shipping_fee desc'
					)
				);
			}
		}
		$addition_transport_fee=0;
		if($weight > $transport_fee['max_weight'])
		{
			$addition_count =ceil(($weight - $transport_fee['max_weight'])/$location['addition_weight']);
			$addition_transport_fee= ($addition_count * $location['addition_fee'])/1000;
		}
		return ($transport_fee['shipping_fee']/1000 + $addition_transport_fee)*1.1+$this->additionShippingFee($district_id,$transport_method)/1000;
	}

	/** Kiểm tra các kho nội vùng có còn hàng không?
	 * @return boolen
	 */
	function checkingStore($products,$stores)
	{
		$right=true; //Ngầm định là các kho còn hàng
		foreach ($products as $product) {
			$get_store=false;
			foreach ($stores as $store) {
				$condition =EAnd(EEqual('store_code',EString($store['code'])),EEqual('product_code',$product['product_code']),EGT('quantity',0));
				$temp_store=CTable('product_store')->select($condition);
				if (!empty($temp_store)) {
					$get_store=$temp_store;
					break;
				}
			}

			if (!$get_store) {
				$right=false;
				break;
			}
		}
		return $right;
	}

	/** Thêm mới bản ghi giao dịch
		@return null
	*/
	/**
	 * Ghi các sản phẩm vào bảng transaction_products
	 *
	 * @param Các sản phẩm cần ghi vào $products
	 * @param Thông tin về giao dịch $transaction
	 * @param Thông tin về các sản phẩm trong DB $old_products
	 * @param Danh sách các kho $stores
	 * @param Thông tin về đơn hàng $tOrder
	 * @return null
	 */
	function insertTransactionProduct($products,$transaction, $old_products,$stores, $order_info,$shop_info=false) {
		$totalProduct = 0;
		$chat_amount=0;
		foreach($products as $item) {
 			$item['transaction_id'] = $transaction['id'];
 			//Hủy bỏ tất cả các %giảm giá của các sản phẩm không được khuyến mại
 			//$item['discount_percent'] = ($item['discount_value']!=0)?$item['discount_percent']:0;
 			//Tăng số sản phẩm khuyến mại đã bán lên 1.
 			if($item['discount_value']>0) {
 				$table = CTable('product');
 				$old_discount_items = CRecord($table->select($item['product_id']))->discount_items;
 				$table->update(array('discount_items'=>$old_discount_items +1),EEqual('id',$item['product_id']));
 			}
 			if ($item['seller_id']!='')
 			{
 				$chat_amount+=$item['amount'];
 			}
			//Cập nhật các sản phẩm đuợc mua phục cụ cho recommendation
			$this->insertVogooBuy($item['product_id']);
 			$store = $this->getDefaultStore($stores,$item['product_code'],$item['quantity']);
 			$temp = array('payment_method'	=> $order_info['payment'],
						'order_time'		=> time(),
 						'status'			=> 0,
						'buyer_full_name'	=> $order_info['buyer_full_name'],
						'buyer_id'			=> $this->userId,
			 			'store_code'		=> $store['code'],
						'store_name'		=> $store['name']
						);
 			$item = $item+$temp;
 			$totalProduct+=$item['quantity'];
			//Cập nhật lại số lượng sản phẩm trong bảng product
			$this->updateProductQuantity($item['product_id'],$item['quantity'], $old_products);
			//Ghi lại sản phẩm giao dịch trong bảng transaction_product
 			$table=CTable('transaction_product')->save($item);
 			$item['id']=$table->inserted_id;
 			//Cập nhật vào bảng estore_transaction
			if (is_array($shop_info)) {
				require_onceportals/vict/portals/estore/models/MEstoreTransaction.php;
				MEstoreTransaction()->insert($item,$shop_info);
			}
 		}
 		if ($chat_amount>0)
 			CTable('transaction')->update(array('application_code'=>'chat','chat_amount'=>$chat_amount),EAnd(EEqual('application_code','vimua'),EEqual('id',$transaction['id'])));
 		$this->totalProduct=$totalProduct;
	}

	/** Lấy thông tin Store default
		@return array
	*/
	function  getDefaultStore($stores,$product_code,$quantity) {
		foreach ($stores as $store) {
			$condition = EAnd(EEqual('store_code',EString($store['code'])),EEqual('product_code',$product_code),EGTE('quantity',$quantity));
			$temp_store = CTable('product_store')->select($condition);
			$default_store = false;
			if (!empty($temp_store)) {
				$default_store = CTable('store')->select(array('code'=>$temp_store['store_code']));
				break;
			}
		}
		return !empty($default_store)?$default_store:array('code'=>'','name'=>'');
	}

	/** Xử lý update số lượng sản phẩm
		@return null
	*/
	function updateProductQuantity($product_id,$quantity, $old_products) {
 		$table = CTable('product');
 		$old_quantity = $old_products[$product_id];
		$table->update(array('quantity'=>$old_quantity-$quantity),$product_id);
		CProduct::update_substitute($product_id);
 	}

	/** Cập nhật sản phẩm mua cho recommendation
		@return null
	*/
	function insertVogooBuy($product_id=NULL) {
		if($product_id) {
			$info = CTable('product')->fields("category_id, category_path")->select_all(EEqual('id',EInt($product_id)), array());
			if ($info) {
				$category_id = $info[0]['category_id'];
				$category_path = $info[0]['category_path'];
			}
			VogooProduct::update_cookie_user_id(user()->id,$product_id,$category_id, $category_path,true);
		}

	}

	/** Hàm tạo mã đơn hàng
		@return string
	*/
 	function makeTransactionCode($transaction_id) {
 		$transaction_code=''.$transaction_id;
 		for($i=1;$i<=10-strlen(''.$transaction_id);$i++) {
 			$transaction_code='0'.$transaction_code;
 		}
 		$transaction_code='VIM'.$transaction_code;
 		return $transaction_code;
 	}

	/** Xử lý đơn đặt hàng
		@return array
	*/
	function getOrderInfo($zone_id,$products,$district_id=0,$transport_method=CTransaction::NORMAl_TRANSPORT_METHOD) {
		$aListProduct =$this->getCartProducts($products);
		$product_amount	= $amount=$aListProduct['product_amount'];
		$products 	= $aListProduct['products'];
		$weight 		= $aListProduct['weight'];

		// Tiền sản phẩm trước khi giảm giá
		$product_amount-=$aListProduct['discount_value']; //Tiền sản phẩm sau khi giảm giá
		$discount_value = $aListProduct['discount_value'];//Giá được giảm
		$discount_percent=$aListProduct['discount_percent'];// Phần trăm được giảm
		$discount_name=($aListProduct['discount_value']>0)?$aListProduct['discount_name']:'';//Tên sản phẩm được giảm giá
		$location=$this->getLocation($zone_id);

		$shipping_fee = $this->getShippingFee($weight,$zone_id,$location,$district_id,$transport_method);//Phí vận chuyển
		$free_shipping = 0;
		if($product_amount>=1000) {
			$free_shipping =  $this->getShippingFee($weight,$zone_id,false,0,CTransaction::NORMAl_TRANSPORT_METHOD);//Phí vận chuyển
			// $shipping_fee -=  $free_shipping;
		}
		$amount = $product_amount + $shipping_fee; //Tổng giá trị đơn hàng sau khi tính phí vận chuyển

		$stores = $this->getStores($zone_id);
		$waiting_time = $this->getWaitingTime($district_id);//Thời gian chờ giao hàng

		$extra_info = array();
		if (isset($aListProduct['time_gold'])) {
			$extra_info['time_gold'] = $aListProduct['time_gold'];
		}

		return array(
			'products'=>$products,
			'product_amount'=>$product_amount,
			'shipping_fee'=>$shipping_fee,
			'free_shipping'=>$free_shipping,
			'waiting_time'=>$waiting_time,
			'discount_value'=>$discount_value,
			'discount_percent'=>$discount_percent,
			'discount_name'=>$discount_name,
			'amount'=>$amount,
			'stores'=>$stores
		);
	}

	function checkout($buyer_info,$products,$shop_info=false) {
		// quang's
		// TODO: Remove this f...ing code
		$cart_products = user()->shopping_cart();
		$product_extras = array();
		foreach ($cart_products as $cart_product) {
			if (isset($cart_product['time_gold']) && $cart_product['time_gold']==1) {
				$product_extras[$cart_product['id']] = array('time_gold'=>1);
			}
		}

		if((count($products)>0) and is_array($buyer_info)) {
			$buyer_info['district_id']=isset($buyer_info['district_id'])?$buyer_info['district_id']:0;
			$cart_info=$this->getOrderInfo($buyer_info['zone_id'],$products,$buyer_info['district_id'],$buyer_info['transport_method']);
			$products=$cart_info['products'];
			$portal_id =portal()->id;
			$transaction = array(
				'portal_id'					=> $portal_id,
				'buyer_id'					=> $this->userId,
				'buyer_full_name' 			=> !empty($buyer_info['buyer_full_name'])?$buyer_info['buyer_full_name']:'',
				'buyer_address' 			=> $buyer_info['buyer_address'].'-'.$buyer_info['buyer_zone_name'],
				'buyer_phone'				=> $buyer_info['buyer_phone'],
				'buyer_mobile'				=> $buyer_info['buyer_mobile'],
				'buyer_id_card'				=> $buyer_info['buyer_id_card'],
				'payment_method'			=> isset($buyer_info['payment'])?$buyer_info['payment']:1,
				'transport_method'			=> $buyer_info['transport_method'],
				'receiver_name'				=> $buyer_info['full_name'],
				'receiver_address'			=> $buyer_info['address'],
				'amount'					=> $cart_info['amount'],
				'shipping_fee'				=> $cart_info['shipping_fee'],
				'free_shipping'				=> $cart_info['free_shipping'],
				'payment_fee'				=> ($buyer_info['payment']==1)?$this->getPaymentFee($cart_info['product_amount']):0,
				//Khoanb Edit 12.05.2009
				'notice'					=> isset($buyer_info['comment'])?$buyer_info['comment']:(isset($buyer_info['notice'])?$buyer_info['notice']:''),
				'receiver_zone_id'			=> $buyer_info['zone_id'],
				'receiver_id_card'			=> $buyer_info['receiver_id_card'],
				'receiver_phone'			=> $buyer_info['phone'],
				'receiver_mobile'			=> $buyer_info['mobile'],
				'waiting_time'				=> $cart_info['waiting_time'],
				'is_deleted'				=> 0,
				'created_time'				=> time(),
				'receive_time'				=> time(),
				'status'					=> 0,
				'application_code'			=> isset($buyer_info['application_code'])?$buyer_info['application_code']:'vimua',
				'source_id'	=> @$buyer_info['source_id'],
				'refer_url'	=> @$buyer_info['refer_url'],
				'buyer_email'				=> isset($buyer_info['buyer_email'])?$buyer_info['buyer_email']:'',
			);

			$product_table = CTable('product');
			$old_products = array();

			$product_datas = array();
			foreach($products as &$item) {
				$product_datas[$item['product_id']] = $product_data = $product_table->select($item['product_id']);
				$old_products[$item['product_id']] = CRecord($product_data)->quantity;
				if($old_products[$item['product_id']] < $item['quantity']) {
					return array(
						'result' => false,
						'msg' => 'Không đủ hàng!'
					);
				}

				// Kiểm tra sản phẩm giờ vàng
				$extra = @$product_extras[$item['product_id']];
				if (isset($extra) && isset($extra['time_gold']) && $extra['time_gold']==1) {
					$product_obj = new CProductDetail($product_data);
					if (!($info = $product_obj->getTimeGoldInfo())) {
						return array(
							'result' => false,
							'msg' => 'Sản phẩm thêm vào lúc giờ vàng, nhưng khi bạn mua đã hết hàng hoặc hết giờ'
						);
					}
				}
			}

			$table = CTable('transaction')->save($transaction);
			if(!$table->inserted_id) {
				return array(
					'result' => false,
					'msg' => 'Không thêm được vào cơ sở dữ liệu!'
				);
			}
			//Tăng số lượng đơn hàng đã khuyến mại
			if($cart_info['discount_value'] > 0) {
				$condition = EAnd(EGT('date',time()-24*3600),ELTE('date',time()));
				$promotion = CTable('daily_promotion')->select($condition);
				if(is_array($promotion)) {
					//Bổ sung thêm người mua hiện tại vào danh sách người trúng giải và tăng số người được khuyến mại
					$winners = $promotion['winners'];
					$winners = empty($winners)?','.$this->userId.',':$winners.$this->userId.',';
					CTable('daily_promotion')->update(array('number_order'=>$promotion['number_order']+1,'winners'=>$winners),$condition);
				}
			}

			$total_product = 0;
			$transaction['id'] = $table->inserted_id;
			$stores=$cart_info['stores'];
			$this->insertTransactionProduct($products,$transaction,$old_products,$stores, $buyer_info,$shop_info);
			$transaction_code = $this->makeTransactionCode($table->inserted_id);
			$table->update(array('transaction_code'=>$transaction_code,'total_product' => $this->totalProduct), array('id'=>$table->inserted_id));

			// quang's
			foreach ($products as $key=>&$item) {
				$product_obj = new CProductDetail($product_datas[$item['product_id']]);
				$product_obj->checkOut($item['quantity'], @$product_extras[$item['product_id']], $transaction['id']);
			}

			if($this->userId == user()->id) {
				session('order','');
				user()->shopping_cart(array());
				cookie('shopping-cart-total-items',0);
			}
			$detailEmail = '';
			if(isset($buyer_info['buyer_email'])) {
				$detailEmail = $buyer_info['buyer_email'];
			}
			// Neu member login vao he thong vimua roi va nguoi mua trung voi user dang login thi
			if($this->userId == user()->id) {
				$new_data = array(
					'full_name' 	=> $buyer_info['buyer_full_name'],
					'address' 		=> $buyer_info['buyer_address'],
					'phone' 			=> $buyer_info['buyer_phone'],
					'mobile' 			=> $buyer_info['buyer_mobile'],
					'zone_id' 		=> $buyer_info['buyer_zone_id']
				);
				$this->updateUserInfo($new_data);
				$detailEmail = CTable('user')->select(array('id'=> $this->userId),array('fields'=>'email'));
				$detailEmail = $detailEmail['email'];
			}
			$this->sendMail($transaction['id'], $buyer_info['buyer_email'], $detailEmail);
			return array('result' => true,
					'msg'								=> '',
					'transaction' 			=> $transaction,
					'items'							=> $products,
					'transaction_id' 		=> $transaction['id'],
					'transaction_code'	=> $transaction_code,
					'waiting_time'			=> $cart_info['waiting_time']
					);

		} else {
			return array(
				'result'	=> false,
				'msg'			=> 'Dữ liệu không hợp lệ!'
			);
		}
	}

	function updateUserInfo($new_data) {
		if($this->userId==user()->id and $user = CTable('user')->select(array('id'=>$this->userId))) {
			CTable('user')->update(
				array(
					'full_name' 	=> $new_data['full_name'],
					'address' 		=> $new_data['address'],
					'phone'				=> $new_data['phone'],
					'mobile'			=> $new_data['mobile'],
					'zone_id'			=> $new_data['zone_id'],
					'total_order'	=> $user['total_order'] + 1
				),
				$this->userId
			);
		}
 	} // End Func

	/** Send Mail
	*/
	function sendMail($transaction_id, $buyer_full_name, $receiver_email)
	{
		require_once 'lib/utils/CMail.php';
		$subject = 'Thông báo đơn hàng';
		$host_name = $_SERVER['HTTP_HOST'].'/';
		$str_label = 'Đây là phiên bản thử nghiệm! Vimua Không chịu trách nhiệm với các đơn hàng tại đây';
		if($_SERVER['HTTP_HOST'] == 'http://vimua.com' or $_SERVER['HTTP_HOST'] == 'vimua.com' or $_SERVER['HTTP_HOST'] == 'http://www.vimua.com' or $_SERVER['HTTP_HOST'] == 'www.vimua.com') {
			$host_name = 'http://www.vimua.com/';
			$str_label = '';
		}
		$body = 'Chào bạn '.$buyer_full_name.
			'!<br/> Cảm ơn bạn đã mua hàng tại Vimua.com<br/>Bạn có thể vào địa chỉ này để vào xem đơn hàng chi tiết:&nbsp;<a href="'.$host_name.'don-hang/'.$transaction_id.'_'.self::EncodeTransaction($transaction_id).'.html">http://www.vimua.com/don-hang/'.$transaction_id.'.html</a><br /> Mọi ý kiến của quý khách vui lòng xem qua mục <a href="http://vimua.com/?page=help&id=26&portal=vimua">Hỗ trợ!</a> <br /> Xin chân thành cảm ơn! <br /><br />Trung tâm thương mại điện tử Vimua.com <br />Tầng 12 -  Tòa nhà FPT Cầu Giấy - Lô B2, Cụm sản xuất tiểu thủ công nghiệp và Công nghiệp nhỏ Cầu Giấy, Đường Phạm Hùng, Quận Cầu Giấy, Hà Nội<br />Email: <a href="mailto:hotro@vimua.com">hotro@vimua.com</a>
			<br /><br /><strong>'.$str_label.'</strong><br /><br />';
		CMail(array(),$subject,$body, $receiver_email)->send();
	}

	static function EncodeTransaction($transaction_id) {
		return md5($transaction_id.'20vimua09');
	}

	/**
	 * Get status of log
	 *
	 * @param unknown_type $transaction_id
	 * @return unknown
	 */
	static function getTransactionLog($transaction_id) {
		$trans_log = CTable('transaction_change_log')->select_all(array('transaction_id'=>$transaction_id));
		$log_status = '';
		if (isset($trans_log) && $trans_log) {
			foreach ($trans_log as &$itemTrans) {
				if ($itemTrans['status'] == -102) {
					$trans_log_status = 'Pendding bởi <span class="user">'.$itemTrans['user_id'].'</span>';
				} else {
					$trans_log_status = CTransactionState::label($itemTrans['status']).' bởi <span class="user">'.$itemTrans['user_id'].'</span>';
				} 				
				$itemTrans['change_time']=is_array($itemTrans)?Date('H\h:i\p d/m/Y',$itemTrans['change_time']):'';
				$log_status .= '<ul class="trans"><li><span class="time">'.$itemTrans['change_time'].':</span> '.$trans_log_status.'</li>';
				if ($itemTrans['comment']) {
					$log_status .= '<li>Chú thích: '.$itemTrans['comment'].'</li>';
				}
				$log_status .= '</ul>';
			}
			return $log_status;
		} else {
			return '';
		}
	}
} // End Class

function CTransaction($userId=false) {
	return new CTransaction($userId);
}